
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime


# 1. 数据清洗和预处理
df = pd.read_csv('./data/数据分析/nba2k-full.csv')

df.drop(['height', 'weight'], axis=1, inplace=True)

# 处理缺失值
df.fillna(method='ffill', inplace=True)

# 2. 数据探索
# 球员平均评分最高
avg_rating = df.groupby('full_name')['rating'].mean().reset_index(name='avg_rating')
avg_rating_sorted = avg_rating.sort_values(by='avg_rating', ascending=False)
print("平均评分最高的球员:")
print(avg_rating_sorted.head(5)[['full_name', 'avg_rating']])

# 薪水最高的球员
highest_paid_player = df.loc[df['salary'].idxmax()]
print("薪水最高的球员:")
print(highest_paid_player[['full_name', 'salary']])

# 为NBA输送球员最多的大学
top_colleges = df['college'].value_counts().head(5)
print("为NBA输送球员最多的大学:")
print(top_colleges)

# 数据可视化
# 平均评分最高的球员柱状图
plt.figure(figsize=(10, 6))
sns.barplot(x='avg_rating', y='full_name', data=avg_rating_sorted.head(5), orient='h')
plt.title('平均评分最高的球员')
plt.xlabel('平均评分')
plt.ylabel('球员名')
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体为黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
plt.show()

# 薪水最高的球员
plt.figure(figsize=(10, 6))
sns.barplot(x=highest_paid_player['salary'], y=['薪水最高的球员'], orient='h')
plt.title('薪水最高的球员')
plt.xlabel('薪水')
plt.ylabel('球员名')
plt.text(0.5, 0.5, highest_paid_player['full_name'], ha='center')

plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体为黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
plt.show()

# 为NBA输送球员最多的大学
plt.figure(figsize=(10, 6))
sns.barplot(x=top_colleges.values, y=top_colleges.index, orient='h')
plt.title('为NBA输送球员最多的大学')
plt.xlabel('球员数量')
plt.ylabel('大学名称')

plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体为黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
plt.show()

# 3. 模型分析（使用线性回归作为基线模型）
# 选择特征和目标变量
X = df[['jersey', 'draft_year', 'version']]
X = pd.get_dummies(X, columns=['team'])  # 独热编码处理team字段
y_rating = df['rating']
y_salary = df['salary']

# 划分训练集和测试集
X_train, X_test, y_train_rating, y_test_rating = train_test_split(X, y_rating, test_size=0.2, random_state=42)
X_train, X_test, y_train_salary, y_test_salary = train_test_split(X, y_salary, test_size=0.2, random_state=42)

# 线性回归模型
lr_model_rating = LinearRegression()
lr_model_rating.fit(X_train, y_train_rating)

lr_model_salary = LinearRegression()
lr_model_salary.fit(X_train, y_train_salary)

# 4. 模型预测
predicted_ratings = lr_model_rating.predict(X)
df['predicted_rating'] = predicted_ratings

predicted_salaries = lr_model_salary.predict(X)
df['predicted_salary'] = predicted_salaries

# 预测下一个版本NBA2K中评分最高的球员
highest_rated_player_predicted = df.loc[df['predicted_rating'].idxmax()]
print("预测下一个版本NBA2K中评分最高的球员:")
print(highest_rated_player_predicted[['full_name', 'predicted_rating']])

# 预测下一个版本NBA2K中薪水最高的球员
highest_paid_player_predicted = df.loc[df['predicted_salary'].idxmax()]
print("预测下一个版本NBA2K中薪水最高的球员:")
print(highest_paid_player_predicted[['full_name', 'predicted_salary']])

# 5. 可视化预测结果
# 预测下一个版本NBA2K中评分最高的球员
plt.figure(figsize=(10, 6))
sns.barplot(x=highest_rated_player_predicted['predicted_rating'], y=['预测评分最高的球员'], orient='h')
plt.title('预测下一个版本NBA2K中评分最高的球员')
plt.xlabel('预测评分')
plt.ylabel('球员名')
plt.text(0.5, 0.5, highest_rated_player_predicted['full_name'], ha='center')

plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体为黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
plt.show()

# 预测下一个版本NBA2K中薪水最高的球员
plt.figure(figsize=(10, 6))
sns.barplot(x=highest_paid_player_predicted['predicted_salary'], y=['预测薪水最高的球员'], orient='h')
plt.title('预测下一个版本NBA2K中薪水最高的球员')
plt.xlabel('预测薪水')
plt.ylabel('球员名')
plt.text(0.5, 0.5, highest_paid_player_predicted['full_name'], ha='center')

plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体为黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
plt.show()